home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / glass / glass.lha / GLASS / glassme / gme06 < prev    next >
Text File  |  1991-02-19  |  5KB  |  113 lines

  1. %TEX
  2. \subsubsection{Fill in applications with right number of parameters}
  3.  
  4. Fill in tries to match the actual arguments of a macro application 
  5. to the formal arguments of a body of the macro definition.
  6. When such a body is found a replace list is built and the body is copied with
  7. formal constructors appearing as a key in the replace list replaced by the value of that key.\\
  8. So the triple $(\lambda,\kappa,\varphi)$ expresses that in the replace list 
  9. $\lambda$ the formal constructor $\kappa$ should be replaced by the actual 
  10. constructor $\varphi$.
  11.  
  12. Glammar offers the designer  builtins to store and retrieve such items easely.
  13. The builtin \verb+ add to(>list,>key,>val)+ stores an item.
  14. \verb+ lookup(>list,>key,val>)+ retrieves the value of an item if it is
  15. in the list; otherwise it fails.
  16. Unique list names can be generated using the builtin \verb+ some name(name>)+. 
  17.  
  18. %
  19.  
  20. fill in (>empty,>x,empty>): ->, fail;
  21. fill in (>fp and body*_,>actual args,matched body>):
  22.     some name (replace list>),
  23.     replace list (>replace list,>actual args,>fp and body,body>), ->,
  24.     copy meta ds (>replace list,>body, matched body>),
  25.     trans val (>matched body, >matched body,>empty); 
  26. fill in (>fp and body*r,>actual args,matched body>):
  27.     fill in (>r,>actual args,matched body>).
  28.  
  29.  
  30. %TEX
  31. \subsubsection{Copy data structure with replace list.}
  32. Here we copy a formal macro body taken into account
  33. that the formal parameters should be replaced by actual ones
  34. The formal names that should be replaced are stored in a 
  35. replace list which contains triples like {\tt (replace list, formal name, 
  36. actual ds pointer)}.
  37. If a formal name {\tt x} must be replaced by an actual name {\tt y}
  38. its name occurs in 
  39. in the replace list as a key . 
  40. An  instance of this triple could {\tt (aY, x, <NODE y>)}.
  41. {\tt aY} is the value of replace list and {\tt <NODE y>} the data structure 
  42. representing  {\tt VSym "y"}
  43. Then we replace the data structure part {\tt FnSym "x"} to the node  {\tt <NODE y>}
  44. which we retrieved as the value of the triple. 
  45.  
  46.  
  47. %
  48. copy meta ds (>replace list,>node, nnode>):
  49.     where (>node,DefVal*valorig*defval*body> ),
  50.     where (>body, VType*vttype* vMacAlts V vMacLambda*_>), ->,
  51.     copy local mac or def (>replace list,>valorig,>defval,>body,
  52.                                >vMacAlts V vMacLambda,nnode>);
  53. copy meta ds (>replace list,>FCSym*STRING* symbol,FCSym*STRING*new name>):->,
  54.     some name (uniq>),
  55.     where (>symbol+"_"+uniq, new name>),
  56.     where (>VSym*org*STRING*new name, new node>),
  57.     where  (>TUPLE*file el*line el, org>),
  58.     where ( >STRING * "local_macroexp_name", file el>),
  59.     where (>I NUM *"0",line el>),
  60.     add to (>replace list,>symbol,>new node);
  61. copy meta ds (>replace list,>VSym*org*STRING* symbol,new node>):
  62.     lookup (>replace list,>symbol, new node>),->;
  63. copy meta ds (>replace list,>VSym*org*STRING* symbol,new node>):
  64.     excludes (>symbol,>"Def"),
  65.     excludes (>symbol,>"Mac"),
  66.     excludes (>symbol,>"Atom"),
  67.     excludes (>symbol,>FORMAL PAR),
  68.     excludes (>symbol,>"Aux"), ->,
  69.     some name (uniq>),
  70.     where (>symbol+"_"+uniq, new name>),
  71.     where (>VSym*org*STRING*new name, new node>),
  72.     add to (>replace list,>symbol,>new node);
  73. copy meta ds (>replace list,>node, node>):
  74.     where (>node,VSym*org*STRING*name>), ->;
  75. copy meta ds  (>replace list,>x*y, new x * new y>): ->,
  76.     copy meta ds (>replace list,>x ,new x>),
  77.     copy meta ds (>replace list,>y ,new y>);
  78. copy meta ds  (>replace list,>x, x >):. 
  79.  
  80. copy local mac or def (>replace list,>valorig,>defval,>body,
  81.                         >VMacAlts,nnode>):-> ,
  82.     where (>defval, STRING*symbol>),
  83.     where (>symbol+"_"+replace list, new name>),
  84.     where ( >STRING*new name, ndefval>),
  85.     where (>VSym*valorig*ndefval, new symbol node>),
  86.     add to (>replace list,>symbol,>new symbol node),
  87.     copy meta ds (>replace list,>body,nbody>),
  88.     where (> DefVal*valorig*ndefval*nbody, nnode>),
  89.     add to (>new name,>"Mac",>nnode);
  90. copy local mac or def (>replace list,>valorig,>defval,>body,
  91.                                 >VMacLambda,nnode>):->,
  92.     where (>defval, STRING*symbol>),
  93.     where (>symbol+"_"+replace list, new name>),
  94.     where ( >STRING*new name, ndefval>),
  95.     where (>VSym*valorig*ndefval, new symbol node>),
  96.     add to (>replace list,>symbol,>new symbol node),
  97.     copy meta ds (>replace list,>body,nbody>),
  98.     where (> DefVal*valorig*ndefval*nbody, nnode>),
  99.     add to (>new name,>"Def",>nnode);
  100. copy local mac or def (>replace list,>valorig,>defval,>body,>V type,nnode>):
  101.     copy meta ds (>replace list,>body,nbody>),
  102.     where (> DefVal*valorig*defval*nbody, nnode>).
  103.  
  104.  
  105.  
  106. trace list (>a*empty):
  107.     type out (>a+"."+nlcr), ->;
  108. trace list (>a*b):
  109.     type out (>a+","+nlcr), 
  110.     trace list (>b),->;
  111. trace list (>a):
  112.     type out (>a+"?"+nlcr).
  113.